#include <windows.h>

#define patch(a, v, s) _patch((void*)(a), (DWORD)(v), (s))

void _patch(void* pAddress, DWORD data, DWORD iSize)
{
	DWORD dwProtect[2];
	VirtualProtect(pAddress, iSize, PAGE_EXECUTE_READWRITE, &dwProtect[0]);
	switch(iSize)
	{
		case 1: *(BYTE*)pAddress = (BYTE)data;
			break;
		case 2: *(WORD*)pAddress = (WORD)data;
			break;
		case 4: *(DWORD*)pAddress = (DWORD)data;
			break;
	}
	VirtualProtect(pAddress, iSize, dwProtect[0], &dwProtect[1]);
}

DWORD WINAPI EnexThread(LPVOID lpParameter)
{
	int		dwAddress;
	UNREFERENCED_PARAMETER(lpParameter);

	Sleep(3000);

	// 1.0
	if ( *(DWORD*)0x82457C == 0x94BF || *(DWORD*)0x8245BC == 0x94BF )
	{
		if ( *(BYTE*)0x43F880 == 0xE9 )
			dwAddress = *(int*)0x43F881 + 0x43F880 + 5 + 0xA8;
		else
			dwAddress = 0x43F880 + 0xA8;
	}
	else
	{
		// 3.0 Steam
		if ( *(DWORD*)0x85EC4A == 0x94BF )
			dwAddress = 0x443190 + 0xA4;
		else
			return TRUE;
	}

	patch(dwAddress, 500, 4);
	return TRUE;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	UNREFERENCED_PARAMETER(hinstDLL);
	UNREFERENCED_PARAMETER(lpvReserved);

	if ( fdwReason == DLL_PROCESS_ATTACH )
		CreateThread(NULL, 0, EnexThread, NULL, 0, NULL);

	return TRUE;
}